﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Maestro_Proveedores.clases.almacen
{
    class ModelFactory
    {

        public ArrayList modelos;

        
        public ModelFactory()
        {
            modelos = new ArrayList();
        }

        //metodo factory para crear el grupo de modelos dependiendo las consideraciones> recibe 1 2 o 3
        public void createModels(int comportamiento)
        {
            switch (comportamiento)
            {
                case 1:
                    MediaMovil mediaMovil = new MediaMovil();
                    modelos.Add(mediaMovil);
                    SuavExpSimple suavExpSimple = new SuavExpSimple();
                    modelos.Add(suavExpSimple);
                    break;

                case 2:
                    SuavExpDoble suavExpDoble = new SuavExpDoble();
                    modelos.Add(suavExpDoble);
                    RegLinealSimple regLinealSimple = new RegLinealSimple();
                    modelos.Add(regLinealSimple);
                    break;

                case 3:
                    Croston croston = new Croston();
                    modelos.Add(croston);
                    break;

                //caso para evaluar todos los modelos

                case 4:
                    MediaMovil mediaMovil4 = new MediaMovil();
                    modelos.Add(mediaMovil4);
                    SuavExpSimple suavExpSimple4 = new SuavExpSimple();
                    modelos.Add(suavExpSimple4);
                    SuavExpDoble suavExpDoble4 = new SuavExpDoble();
                    modelos.Add(suavExpDoble4);
                    RegLinealSimple regLinealSimple4 = new RegLinealSimple();
                    modelos.Add(regLinealSimple4);
                    Croston croston4 = new Croston();
                    modelos.Add(croston4);
                    break;

                default:
                    break;
            } 
            
        }

        public ArrayList calcularPronosticos(ArrayList registros) {
            foreach(ModeloAbstracto model in this.modelos){
                model.calcularModelo(registros);
            }
            return modelos;
        }
        
        // se recorren la lista de modelos y se evalua el menor ECM, este será el pronostico mas adecuado..
        public ModeloAbstracto modeloApropiado()
        {
            double minECM = 0;
            ModeloAbstracto modeloA=new MediaMovil() ;
            
            foreach (ModeloAbstracto model in this.modelos)
            {
                minECM = model.obtenerResultado().ECM;
                modeloA = model;
            }

            foreach (ModeloAbstracto model in this.modelos)
            {
                if (model.obtenerResultado().ECM < minECM)
                {
                    minECM = model.obtenerResultado().ECM;
                    modeloA = model;
                }
            }

            return modeloA;
        }

    }
}
